
# 由于函数也是一个对象，而且函数对象可以被赋值给变量，所以，通过变量也能调用该函数。


import time


def now():
    print('2015-')


f = now
# print(f)
print(f())
print(now())
# 在函数调用前后自动打印日志，但又不希望修改now()函数的定义，这种在代码运行期间动态增加功能的方式，称之为“装饰器”（Decorator）。


def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper


@log
def now2():
    print('2015-3-25')


# 把@log放到now()函数的定义处，相当于执行了语句：
# now = log(now)
print(now2())


def metric(fn):
    print('%s executed in %s ms' % (fn.__name__, 10.24))
    return fn
@metric
def fast(x, y):
    time.sleep(0.0012)
    return x + y
print(fast(1,2))